package com.twq.patternmatch.basic

/**
 * Created by tangweiqun on 2017/12/8.
 */
object SimplePatternMatch {
  def main(args: Array[String]): Unit = {

    //简化三个数学表达式
    UnOp("-", UnOp("-", Var("x"))) // 负负得正
    BinOp("+", Var("x"), Number(0)) //加0的任何是就是原值
    BinOp("*", Var("x"), Number(1)) // 乘以1的数就是原值

    //1、用模式匹配来简化上面的数学表达式
    //expr: 称之为selector expression，是一个表达式
    //match后的{}称之为alternatives(可选方案)
    //每一个可选方案包括了一个pattern(模式)和一个或者多个表达式
    def simplifyExpr(expr: Expr): Expr = expr match {
      case UnOp("-", UnOp("-", e)) => e // 负负得正
      case BinOp("+", e, Number(0)) => e // 加0的任何是就是原值
      case BinOp("*", e, Number(1)) => e // 乘以1的数就是原值
      case _ => expr
    }

    simplifyExpr(UnOp("-", UnOp("-", Var("x")))) //res4: Expr = Var(x)


    //2、scala match pattern vs java switch
    val i = 4
    //selector match {alternatives}
    val result = i match {
      case 1 => 1
      case 2 => 2
      case 3 => 3
    }

    println(result)

    //1、Scala的match表达式可以计算出一个值，而Java的switch却不能

    //2、模式匹配的alternatives表达式永远不会穿透到下一个case表达式中
    //java的switch中没有break的话，则会穿透到下一个分支

    //3、模式匹配中如果没有任何的模式被匹配到，则抛出MatchError异常

  }
}
